package com.jwd.avmanager.server;


import com.jwd.avmanager.constant.Constants;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
import java.net.InetSocketAddress;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;


public class TextWebSocketHandler extends SimpleChannelInboundHandler<TextWebSocketFrame> {
    /*
    经过测试，在 ws 的 uri 后面不能传递参数，不然在 netty 实现 websocket 协议握手的时候会出现断开连接的情况。
   针对这种情况在 websocketHandler 之前做了一层 地址过滤，然后重写
   request 的 uri，并传入下一个管道中，基本上解决了这个问题。
    * */
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {


        if (null != msg && msg instanceof FullHttpRequest) {


            FullHttpRequest request = (FullHttpRequest) msg;
            System.err.println("调用 channelRead request.uri() [ {} ] "+ request.uri());
            String uri = request.uri();
            System.err.println("Origin [ {} ] [ {} ] "+ request.headers().get("Origin")+","+ request.headers().get("Host"));
            String origin = request.headers().get("Origin");
            if (null == origin) {
                System.err.println("origin 为空 ");
                ctx.close();
            } else {
                if (null != uri && uri.contains(Constants.DEFAULT_WEB_SOCKET_LINK) && uri.contains("?")) {
                    String[] uriArray = uri.split("\\?");
                    for (String s : uriArray) {
                        System.err.println(s);
                    }
                    if (null != uriArray && uriArray.length > 1) {
                        String[] paramsArray = uriArray[1].split("=");
                        if (null != paramsArray && paramsArray.length > 1) {

                            System.err.println(paramsArray[0]);
                            System.err.println(paramsArray[1]);
//                            onlineContainer.putAll(paramsArray[1], ctx);
                        }
                    }
                    request.setUri(Constants.DEFAULT_WEB_SOCKET_LINK);
                } else if(null != uri && uri.contains(Constants.DEFAULT_WEB_SOCKET_LINK2)) {
                    String s1 = uri.replaceAll(Constants.DEFAULT_WEB_SOCKET_LINK2,"");
                    String[] uriArray = s1.split("/");
                    for (String s : uriArray) {
                        System.err.println(s);
                    }
                    request.setUri(Constants.DEFAULT_WEB_SOCKET_LINK2);
                }  else {
                    System.err.println("不允许 [ {} ] 连接 强制断开"+origin);
                    ctx.close();
                }
            }
        }
        super.channelRead(ctx, msg);
    }

    @Override
    protected void channelRead0(ChannelHandlerContext ctx, TextWebSocketFrame msg) throws Exception {
        System.err.println("接收到客户端的消息:[{}]"+msg.text());
        // 如果是向客户端发送文本消息，则需要发送 TextWebSocketFrame 消息
        InetSocketAddress inetSocketAddress = (InetSocketAddress) ctx.channel().remoteAddress();
        String ip = inetSocketAddress.getHostName();
        String txtMsg = "[" + ip + "][" + LocalTime.now().format(DateTimeFormatter.ofPattern("HH:mm:ss")) + "] ==> " + msg.text();
        //TODO 这是发给自己
        ctx.channel().writeAndFlush(new TextWebSocketFrame(txtMsg));
    }

}
